/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo5.gestionAsientos;

import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso2011.grupo5.Args;
import org.uca.dss.curso2011.grupo5.DBUtils;
import org.uca.dss.curso2011.grupo5.HorarioTren;
import org.uca.dss.curso2011.grupo5.Trayecto;
import org.uca.dss.curso2011.grupo5.interfazExtendido.InformacionTrayecto;
import org.uca.dss.curso2011.grupo5.interfazExtendido.ReservaTrayecto;

/**
 *
 * @author Luis
 */
public class AleatorioAsientos implements GestionAsientos {

    public AleatorioAsientos(List<Trayecto> ltrayectos) throws IllegalArgumentException
    {
        Args.comprobarNulo(ltrayectos);

        this.ltrayectos = ltrayectos;
    }

    public int apply(final InformacionTrayecto iT, final LocalDate fecha)  throws IllegalArgumentException
    {
        Args.comprobarNulo(iT);
        Args.comprobarNulo(fecha);
        
        // Todas las reservas del trayecto en cuestion.
        ObjectContainer db = DBUtils.getDb();

        ObjectSet<ReservaTrayecto> reservas = db.query(new Predicate<ReservaTrayecto>()
        {
            @Override
            public boolean match(ReservaTrayecto et)
            {
                return et.getTrayecto().getOrigen().equals(iT.getOrigen()) &&
                       et.getTrayecto().getDestino().equals(iT.getDestino()) &&
                       et.getFechaSalida().isEqual(fecha) && et.getTrayecto().getHoraSalida().isEqual(iT.getHoraSalida());
            }

        });

        // De esas reservas, crearse una lista con los asientos de cada una de ellas
        List<Integer> lasientos = new ArrayList<Integer>();
        for(ReservaTrayecto rT : reservas)
        {
            lasientos.add(rT.getNumeroAsiento());
        }

        // Averiguar el número de asientos del tren


        int numAsientos = 0;
        int numAsiento;
        boolean encontrado = false;
        Iterator<Trayecto> itTrayecto = ltrayectos.iterator();
        
        while(itTrayecto.hasNext() && !encontrado)
        {
            Trayecto t = itTrayecto.next();

            // CIUDADES
            if(t.getCiudadOrigen().equals(iT.getOrigen()) && t.getCiudadDestino().equals(iT.getDestino()) && !encontrado)
            {
                Iterator<HorarioTren> itHorarios = t.getHorarios();

                while(itHorarios.hasNext())
                {
                    HorarioTren hR = itHorarios.next();

                    LocalTime salida = new LocalTime(hR.getHoraSalida());
                    LocalTime llegada = new LocalTime(hR.getHoraLlegada());

                    if(salida.isEqual(new LocalTime(iT.getHoraSalida())) &&
                       llegada.isEqual(new LocalTime(iT.getHoraLlegada())))
                    {
                        numAsientos = hR.getNumAsientos();
                        encontrado = true;
                    }
                }
            }
        }

        // Crear un asiento aleatorio que no esté en la lista
        if(encontrado)
        {
            int asiento;
            do
            {
                Random random = new Random();
                asiento = random.nextInt(numAsientos);

            } while (lasientos.contains(asiento));

            numAsiento = asiento;
        }
        else
        {
            throw new RuntimeException("AleatorioAsientos: No se encontra coincidencia entre los trayectos y el información trayecto.");
        }

        // Devolver el asiento aplicado.
        return numAsiento;
    }

    public GestionAsientos clone() throws CloneNotSupportedException
    {
        return (GestionAsientos) super.clone();
    }

    private List<Trayecto> ltrayectos;
}
